package com.miaosha.controller;

import com.google.common.util.concurrent.RateLimiter;
import com.miaosha.serivce.OrderSerivce;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import sun.security.provider.MD5;

import java.util.concurrent.TimeUnit;

@RestController
@Slf4j
@RequestMapping("stock")
public class StockController {

    @Autowired
    private OrderSerivce orderSerice;



/*    @GetMapping("kill")
    public String kil(Integer id){

        try {
            System.out.println("秒杀商品当前的id:" + id);
            //根据商品去秒杀
            int orderId;
            *//**
             *  悲观锁 解决 并发   同步代码块
             *//*
        synchronized (this){
            orderId=orderSerice.kill(id);
        }
          return "商品秒杀成功,商品id:"+orderId;
        } catch (Exception e) {
            e.printStackTrace();
           return "秒杀失败";
        }

    }*/


    /**
     *   乐观锁 防止 多卖
     * @param id
     * @return
     */
    @GetMapping("version")
    public String version(Integer id){
        try {
            System.out.println("秒杀商品当前的id:" + id);
            //根据商品去秒杀
            int orderId;
            /**
             *  悲观锁 解决 并发   同步代码块
             */
            synchronized (this){
                orderId=orderSerice.kill(id);
            }
            return "商品秒杀成功,商品id:"+orderId;
        } catch (Exception e) {
            e.printStackTrace();
            return "秒杀失败";
        }
    }

    /**
     *      令牌桶
     */
    //创建令牌桶的实例     10个令牌
      private RateLimiter rateLimiter=RateLimiter.create(30);

      @GetMapping("sale")
    public String sale(Integer id){
           //没有获取到tocke 请求 一直到获取token 令牌
          //设置一个等到时间 如果在等到时间内获取到了token 令牌 则处理 如果在等到时间内没有获取到相应 token 则抛弃
          // log.info("等到时间:"+rateLimiter.acquire());
          if(!rateLimiter.tryAcquire(2, TimeUnit.SECONDS)){
              System.out.println("当前请求被限流，无法调用秒杀");
              return "秒杀失败";
          }
          System.out.println("处理业务.............");
          return "秒杀成功";
      }



    /**
     *   乐观锁 防止 多卖+ 令牌桶 +md5验证
     * @param id
     * @return
     */
    @GetMapping("socktoken")
    public String socktoken(Integer id,Integer userId,String md5){
        try {
            if(!rateLimiter.tryAcquire(3, TimeUnit.SECONDS)){
                System.out.println("当前秒杀过于火爆，请重试!");
                return "秒杀失败";
            }
            System.out.println("秒杀商品当前的id:" + id);
            //根据商品去秒杀
            int orderId;
            /**
             *  悲观锁 解决 并发   同步代码块
             */
                orderId=orderSerice.kill(id,userId,md5);
            return "商品秒杀成功,商品id:"+orderId;
        } catch (Exception e) {
            e.printStackTrace();
            return "秒杀失败";
        }
    }

    //生茶md5值得方法
    @RequestMapping("md5")
    public String getMd5(Integer id,Integer userId){
        String md5;
        try {
            md5=orderSerice.getMd5(id,userId);
        } catch (Exception e) {
            e.printStackTrace();
            return "获取MD5失败";
        }
        return "获取MD5信息为："+ md5;
    }

}
